package com;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 获取所有方法
 * 
 * @author yingfing
 * @date 2020年10月2日 @time 下午8:17:49
 */
public class Reflect_04 {
	public static void main(String[] args) throws Exception {
		test1();
//		test2();
//		test3();
	}

	/**
	 * 获取所有方法
	 * 
	 * @throws Exception
	 */
	public static void test1() throws Exception {

		Class c = Class.forName("java.lang.String");
		// 所有方法
		Method[] ms = c.getDeclaredMethods();
		// 每一个方法
		for (Method method : ms) {
			// 修饰符
			System.out.print(Modifier.toString(method.getModifiers()) + " ");

			// 返回值类型
			Class returnType = method.getReturnType();
//			System.out.print(returnType.getName());
			System.out.print(returnType.getSimpleName() + " ");

			// 方法名
			System.out.print(method.getName() + " ( ");

			// 参数列表
			Class[] parameterTypes = method.getParameterTypes();
			for (Class parameterType : parameterTypes) {
				System.out.print(parameterType.getSimpleName() + " , ");
			}
			System.out.println(" ) ");
		}
	}

	/**
	 * 获取指定 的方法
	 * 
	 * @throws Exception
	 */
	public static void test2() throws Exception {

		Class c = Class.forName("java.lang.String");
		Method method = c.getDeclaredMethod("equals", Object.class);
//		Method method2 = c.getDeclaredMethod("trim");
		// 每一个方法
		// 修饰符
		System.out.print(Modifier.toString(method.getModifiers()) + " ");

		// 返回值类型
		Class returnType = method.getReturnType();
//		System.out.print(returnType.getName());
		System.out.print(returnType.getSimpleName() + " ");

		// 方法名
		System.out.print(method.getName() + " ( ");

		// 参数列表
		Class[] parametersTypes = method.getParameterTypes();
		for (Class parametersType : parametersTypes) {
			System.out.print(parametersType.getSimpleName() + " , ");
		}
		System.out.println(" ) ");
	}

	/**
	 * 方法调用
	 * 
	 * @throws Exception
	 */
	public static void test3() throws Exception {

		Class c = Class.forName("com.Login");
		Method method = c.getDeclaredMethod("login", String.class, String.class);
		method.setAccessible(true);

		Object o = c.newInstance();

		// 方法对象.invoke(方法所在对象,参数)
		Object result = method.invoke(o, "admin", "root");
		System.out.println(result);
	}
}

class Login {
	private boolean login(String name, String pwd) {
		if ("admin".equals(name)) {
			if ("root".equals(pwd)) {
				System.out.println("登录成功 ! ");
				return true;
			} else {
				System.out.println("密码不正确 ! ");
				return false;
			}
		} else {
			System.out.println("用户名不正确 ! ");
			return false;
		}
	}
}